﻿Imports System.Data.SqlClient
Module modKetNoi
    ' Lưu trữ chuỗi kết nối
    Public strConnectionString As String = ""
    Public aryConfig As New System.Collections.Hashtable

    Public Function TruyVanDanhSach(ByVal strSql As String) As DataTable
        Dim myConn As New SqlConnection(modKetNoi.strConnectionString)
        Dim myTable As New DataTable
        Try
            myConn.Open()
            Dim myAdapter As New SqlDataAdapter(strSql, myConn)
            myAdapter.Fill(myTable)
        Catch ex As Exception

        End Try
        myConn.Close()
        myConn.Dispose()
        Return myTable
    End Function

    Public Sub CapNhatGiaVonHangBan(ByVal MaHH As String, ByVal Thang As Integer, ByVal Nam As Integer)
        Dim myConn As New SqlConnection(modKetNoi.strConnectionString)
        Dim myTable As New DataTable
        Dim myComm As New SqlCommand
        Dim arlDauKy As New ArrayList()
        Dim strSql As String = "Select SLTonDK, GTTonDK, GiaVonDK from CTHangHoa where MaHH = @MaHH and Thang = @Thang and Nam = @Nam "
        Try
            myConn.Open()
            myComm.Connection = myConn
            myComm.CommandText = strSql
            myComm.Parameters.AddWithValue("@MaHH", MaHH)
            myComm.Parameters.AddWithValue("@Thang", Thang)
            myComm.Parameters.AddWithValue("@Nam", Nam)
            Dim myAdapter As New SqlDataAdapter(myComm)
            myAdapter.Fill(myTable)
            If myTable.Rows.Count > 0 Then
                arlDauKy.Add(myTable.Rows(0)(0).ToString())
                arlDauKy.Add(myTable.Rows(0)(1).ToString())
                arlDauKy.Add(myTable.Rows(0)(2).ToString())
            Else
                arlDauKy.Add(0)
                arlDauKy.Add(0)
                arlDauKy.Add(0)
            End If

            strSql = "Select "
            strSql &= " ct.MaPhieuCT, "
            strSql &= " sc.LoaiCT, "
            strSql &= " ct.SoLuong, "
            strSql &= " case "
            strSql &= " when ct.USD = 1 then sc.TyGia * ct.SoLuong * ct.DonGia "
            strSql &= "	else ct.SoLuong * ct.DonGia "
            strSql &= " end as TienHang, "
            strSql &= " ct.ThueNK "
            strSql &= " from"
            strSql &= " CTSoCai ct"
            strSql &= " inner join SoCai sc on ct.MaPhieu = sc.MaPhieu"
            strSql &= " where "
            strSql &= " datepart(Month, sc.NgayCT) = @Thang "
            strSql &= " and datePart(Year, sc.NgayCT) = @Nam "
            strSql &= " and ct.MaHH = @MaHH "
            strSql &= " order by sc.NgayCT ASC, sc.LoaiCT"
            myComm.CommandText = strSql
            myComm.Parameters.Clear()
            myComm.Parameters.AddWithValue("@MaHH", MaHH)
            myComm.Parameters.AddWithValue("@Thang", Thang)
            myComm.Parameters.AddWithValue("@Nam", Nam)
            myAdapter = New SqlDataAdapter(myComm)
            myTable = New DataTable()
            myAdapter.Fill(myTable)
            If myTable.Rows.Count > 0 Then
                strSql = "Update CTSoCai set TonKho = @TonKho, GiaTri = @GiaTri, GiaVon = @GiaVon where MaPhieuCT = @MaPhieuCT"
                Dim soluong As Double
                Dim giatri As Double
                Dim row As DataRow = myTable.Rows(0)
                Dim GiaVonTruoc As Double = 0
                myComm.CommandText = strSql
                myComm.Parameters.Clear()
                myComm.Parameters.AddWithValue("@MaPhieuCT", row(0))
                myComm.Parameters.AddWithValue("@TonKho", arlDauKy.Item(0))
                myComm.Parameters.AddWithValue("@GiaTri", arlDauKy.Item(1))
                myComm.Parameters.AddWithValue("@GiaVon", arlDauKy.Item(2))
                myComm.ExecuteNonQuery()
                soluong = arlDauKy.Item(0) + row(2)
                giatri = arlDauKy.Item(1) + row(3)
                If Not row(4) Is DBNull.Value Then
                    giatri += row(4)
                End If
                If soluong <> 0 Then
                    GiaVonTruoc = Math.Round(giatri / soluong)
                Else
                    GiaVonTruoc = 0
                End If
                For i As Integer = 1 To myTable.Rows.Count - 1
                    row = myTable.Rows(i)
                    myComm.Parameters.Clear()
                    myComm.Parameters.AddWithValue("@TonKho", soluong)
                    myComm.Parameters.AddWithValue("@GiaTri", giatri)
                    myComm.Parameters.AddWithValue("@GiaVon", GiaVonTruoc)
                    If row(1) = "PNK" Then
                        soluong = soluong + row(2)
                        giatri = giatri + row(3)
                        If Not row(4) Is DBNull.Value Then
                            giatri += row(4)
                        End If
                    Else
                        soluong = soluong - row(2)
                        giatri = giatri - (row(2) * GiaVonTruoc)
                    End If
                    If soluong <> 0 Then
                        GiaVonTruoc = Math.Round(giatri / soluong)
                    Else
                        GiaVonTruoc = 0
                    End If
                    myComm.Parameters.AddWithValue("@MaPhieuCT", row(0))
                    myComm.ExecuteNonQuery()
                Next

            End If
        Catch ex As Exception
            Throw ex
        End Try
        myConn.Close()
        myConn.Dispose()
    End Sub

    Public Function TinhSoLuongTonKho(ByVal MaPhieu As String, ByVal MaHH As String, ByVal NgayCT As DateTime) As Double
        Dim myConn As New SqlConnection(modKetNoi.strConnectionString)
        Dim myTable As New DataTable
        Dim myComm As New SqlCommand
        Dim tonkho As Double = 0
        Dim strSql As String = "Select SLTonDK, GTTonDK, GiaVonDK from CTHangHoa where MaHH = @MaHH and Thang = @Thang and Nam = @Nam "
        Try
            myConn.Open()
            myComm.Connection = myConn
            myComm.CommandText = strSql
            myComm.Parameters.AddWithValue("@MaHH", MaHH)
            myComm.Parameters.AddWithValue("@Thang", NgayCT.Month)
            myComm.Parameters.AddWithValue("@Nam", NgayCT.Year)
            Dim myAdapter As New SqlDataAdapter(myComm)
            myAdapter.Fill(myTable)
            If myTable.Rows.Count > 0 Then
                tonkho = myTable.Rows(0)(0)
            End If

            myComm.Parameters.Clear()
            strSql = "Select "
            strSql &= " ct.MaPhieuCT, "
            strSql &= " sc.LoaiCT, "
            strSql &= " ct.SoLuong, "
            strSql &= " case "
            strSql &= " when ct.USD = 1 then sc.TyGia * ct.SoLuong * ct.DonGia "
            strSql &= "	else ct.SoLuong * ct.DonGia "
            strSql &= " end as TienHang "
            strSql &= " from"
            strSql &= " CTSoCai ct"
            strSql &= " inner join SoCai sc on ct.MaPhieu = sc.MaPhieu"
            strSql &= " where "
            strSql &= " datepart(Month, sc.NgayCT) = @Thang "
            strSql &= " and datePart(Year, sc.NgayCT) = @Nam "
            strSql &= " and ct.MaHH = @MaHH "
            strSql &= " and NgayCT <= convert(DATETIME, @NgayCT, 103) "
            If MaPhieu <> "" Then
                strSql &= " and sc.MaPhieu <> @MaPhieu "
                myComm.Parameters.AddWithValue("@MaPhieu", MaPhieu)
            End If
            strSql &= " order by sc.NgayCT ASC, sc.LoaiCT"
            myComm.CommandText = strSql
            myComm.Parameters.AddWithValue("@MaHH", MaHH)
            myComm.Parameters.AddWithValue("@Thang", NgayCT.Month)
            myComm.Parameters.AddWithValue("@Nam", NgayCT.Year)
            myComm.Parameters.AddWithValue("@NgayCT", NgayCT.ToString("dd/MM/yyyy"))
            myAdapter = New SqlDataAdapter(myComm)
            myTable = New DataTable()
            myAdapter.Fill(myTable)
            If myTable.Rows.Count > 0 Then
                For Each row As DataRow In myTable.Rows
                    If row(1) = "PNK" Then
                        tonkho = tonkho + row(2)
                    Else
                        tonkho = tonkho - row(2)
                    End If
                Next
            End If
        Catch ex As Exception
            Throw ex
        End Try
        myConn.Close()
        myConn.Dispose()
        Return tonkho
    End Function

    Public Function NgayChungTuHopLe(ByVal NgayCT As DateTime) As Boolean
        Dim result As Boolean = True
        Dim myConn As New SqlConnection(modKetNoi.strConnectionString)
        Dim strSql As String = "select Top 1"
        strSql &= " case when convert(datetime, @NgayCT,103) <= convert(datetime,'01/' + cast(thang as varchar) + '/' + cast(nam as varchar),103) then 0 else 1 end as valid "
        strSql &= "    from KhoaSo "
        strSql &= " Order by convert(datetime,'01/' + cast(thang as varchar) + '/' + cast(nam as varchar),103) desc"
        Dim myTable As New DataTable
        Try
            myConn.Open()
            Dim myAdapter As New SqlDataAdapter(strSql, myConn)
            myAdapter.SelectCommand.Parameters.AddWithValue("@NgayCT", NgayCT.ToString("01/MM/yyyy"))
            myAdapter.Fill(myTable)
            If myTable.Rows.Count > 0 AndAlso myTable.Rows(0)(0) = 0 Then
                result = False
            End If
        Catch ex As Exception

        End Try
        myConn.Close()
        myConn.Dispose()
        Return result
    End Function

    Public Function VND(ByVal Baonhieu As Double) As String
        Dim KetQua, SoTien As String
        Dim nhom, chu As String
        Dim dich, s1 As String
        Dim s2, s3 As String
        Dim i, j As Byte
        Dim Vitri As Byte
        Dim s As Double
        Dim hang() As String = {"Không", "trăm", "mười", "gì đó"}
        Dim doc() As String = {"Không", "tỷ", "triệu", "ngàn", "đồng", "xu"}
        Dim dem() As String = {"Không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"}
        On Error Resume Next
        If Baonhieu = 0 Then
            KetQua = "Không đồng"
        Else
            If System.Math.Abs(Baonhieu) > 999999999999.99 Then
                KetQua = "Số quá lớn"
            Else
                If Baonhieu < 0 Then
                    KetQua = "Trừ" & Space(1)
                Else
                    KetQua = Space(0)
                End If
                SoTien = Format(System.Math.Abs(Baonhieu), "###########0.00")
                SoTien = Microsoft.VisualBasic.Right(Space(12) & SoTien, 15)
                For i = 1 To 5
                    nhom = Mid(SoTien, i * 3 - 2, 3)
                    If nhom <> Space(3) Then
                        Select Case nhom
                            Case "000"
                                If i = 4 Then
                                    chu = "đồng" & Space(1)
                                Else
                                    chu = Space(0)
                                End If
                            Case ".00", ",00"
                                chu = "chẵn"
                            Case Else
                                s1 = Microsoft.VisualBasic.Left(nhom, 1)
                                s2 = Mid(nhom, 2, 1)
                                s3 = Microsoft.VisualBasic.Right(nhom, 1)
                                chu = Space(0)
                                hang(3) = doc(i)
                                For j = 1 To 3
                                    dich = Space(0)
                                    s = Val(Mid(nhom, j, 1))
                                    If s > 0 Then
                                        dich = dem(s) & Space(1) & hang(j) & Space(1)
                                    End If
                                    Select Case j
                                        Case 2 And s = 1
                                            dich = "mươi" & Space(1)
                                        Case 3 And s = 0 And nhom <> Space(2) & "0"
                                            dich = hang(j) & Space(1)
                                        Case 3 And s = 5 And s2 <> Space(1) And s2 <> "0"
                                            dich = "l" & Mid(dich, 2)
                                        Case 2 And s = 0 And s3 <> "0"
                                            If (s1 >= "1" And s1 <= "9") Or (s1 = "0" And i = 4) Then
                                                dich = "lẻ" & Space(1)
                                            End If
                                    End Select
                                    chu = chu & dich
                                Next j
                        End Select
                        Vitri = InStr(1, chu, "mươi một", CompareMethod.Text)
                        If Vitri > 0 Then Mid(chu, Vitri, 9) = "mươi mốt"
                        KetQua = KetQua & chu
                    End If
                Next i
            End If
        End If
        VND = UCase(Microsoft.VisualBasic.Left(KetQua, 1)) & Mid(KetQua, 2)
    End Function

    Dim ChuSo() As String = {"không", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"}
    Dim DonVi() As String = {"đơn vị", "ngàn", "triệu", "tỉ"}

    Function DocSo(ByVal so As String) As String
        so = so.TrimStart("0")
        'bỏ những số "0" ở đầu tiên

        If so.Length = 0 Then Return ""

        so = so.Replace(" ", "").Replace(",", "").Replace(".", "")
        'nếu muốn cho phép có dấu " " hay "," hay "." trong số để dễ nhìn thì uncomment dòng đây

        Dim kq As String = ""
        Dim chieudai As Integer = so.Length

        'dùng biến để lưu lại từng nhóm ba chữ số dể dễ xài
        Dim sonhom As Integer = Math.Ceiling(chieudai / 3)
        'tính số lượng nhóm 3 chữ số
        Dim nhom(sonhom - 1) As String

        'cóp nhóm đầu tiên , rồi lần lượt những nhóm còn lại , j là chiều dài nhóm đầu tiên
        Dim j As Integer = chieudai - (sonhom - 1) * 3
        nhom(0) = so.Substring(0, j)
        For i As Integer = 1 To sonhom - 1
            nhom(i) = so.Substring(j + (i - 1) * 3, 3)
        Next

        For i As Integer = 0 To nhom.Length - 1
            kq &= docnhom3so(nhom(i), tinhdonvi(nhom.Length - 1 - i)) & " "
        Next

        Return kq.Trim.Replace("  ", " ")
        'để chắc chắn không có 2 dấu cách đứng liền nhau và 0 có dấu cách ở 2 đầu
    End Function

    Function tinhdonvi(ByVal n As Integer) As String
        'hàm đệ qui rất đơn giản
        If n <= 3 Then
            Return DonVi(n)
        Else
            Return tinhdonvi(n - 3) & " " & DonVi(3)
        End If
    End Function

    Function docnhom3so(ByVal số As String, ByVal đơnvị As String) As String
        Dim kq As String = ""
        Dim l As Integer = số.Length

        số = số.PadLeft(3, "0")

        If số = "000" Then Return ""
        'không đọc những nhóm "000" như trong "1.000.000.000"

        If số.StartsWith("00") Then Return đọcsốhàngđơnvị(Val(số(2)), 0, l = 3) & " " & đơnvị
        'chỗ này để tránh khó nghe khi đọc "1.000.000.001" , nó sẽ bỏ qua từ "không trăm" và chỉ đọc "một tỉ lẻ một đơn vị" , nếu không thích thì xóa dòng đây đi cũng được

        kq &= đọcsốhàngtrăm(Val(số(0)), l = 3)
        kq &= đọcsốhàngchục(Val(số(1)))
        kq &= đọcsốhàngđơnvị(Val(số(2)), Val(số(1)), l = 3)

        Return kq & " " & đơnvị
    End Function

    Function đọcsốhàngtrăm(ByVal i As Integer, ByVal đọcsốkhông As Boolean) As String
        'biến đọcsốkhông để tránh đọc chữ "không trăm" trong số < 100 như "75" , nếu không dùng biến này thì sẽ đọc là "không trăm bảy mươi lăm"

        If i = 0 Then
            If đọcsốkhông Then
                Return "không trăm "
            Else
                Return ""
            End If
        Else
            Return ChuSo(i) & " trăm "
        End If
    End Function

    Function đọcsốhàngchục(ByVal i As Integer) As String
        Select Case i
            Case 0
                Return ""
            Case 1
                Return "mười "
            Case Else
                Return ChuSo(i) & " mươi "
        End Select
    End Function

    Function đọcsốhàngđơnvị(ByVal i As Integer, ByVal hàngchục As Integer, ByVal đọcchữlẻ As Boolean) As String
        'biến đọcchữlẻ để tránh đọc chữ "lẻ" trong số < 10 như "2" , nếu không dùng biến này thì sẽ đọc là "lẻ hai"
        'các lệnh điều khiển If...then và select...case chỉ là để đọc cho giống tiếng việt

        If i = 0 Then
            Return ""
        Else
            If hàngchục = 0 Then
                If đọcchữlẻ Then
                    Return "lẻ " & ChuSo(i)
                Else
                    Return ChuSo(i)
                End If
            Else
                Select Case i
                    Case 1
                        If hàngchục = 1 Then
                            Return "một"
                        Else
                            Return "mốt"
                        End If
                    Case 5
                        Return "lăm"
                    Case Else
                        Return ChuSo(i)
                End Select
            End If
        End If

    End Function


End Module
